/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package permissaoUsuario;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author PauloM
 */
public class RepositorioPermissaoUsuario implements IRepositorioPermissaoUsuario {

    /**
     * Contrutor da classe
     * 
     * @throws ErroAcessoRepositorioException
     */
    public RepositorioPermissaoUsuario() throws ErroAcessoRepositorioException {
    }
    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    /**
     * Metodo que ira cadastrar o PermissaoUsuario
     *
     * @param PermissaoUsuario objPermissaoUsuario
     * @return void
     */
    public void cadastrarAtualizar(PermissaoUsuario objPermissaoUsuario) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            s.saveOrUpdate(objPermissaoUsuario);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), e, 0);
        }

    }

    /**
     * Metodo que ira produrar o PermissaoUsuario
     *
     * @param int idPermissaoUsuario
     * @return void
     */
    public PermissaoUsuario procurar(int idPermissaoUsuario) throws PermissaoUsuarioNaoCadastradoException, ErroAcessoRepositorioException {
        PermissaoUsuario objPermissaoUsuario = null;

        if (this.existe(idPermissaoUsuario)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = (Transaction) s.beginTransaction();
                // Salvando o produto no banco
                objPermissaoUsuario = (PermissaoUsuario) s.get(PermissaoUsuario.class, idPermissaoUsuario);
                // Comtando tudo caso der certo
                t.commit();
            } catch (Exception e) {
                t.rollback();
            }
        } else {
            throw new PermissaoUsuarioNaoCadastradoException("Permissão Usuario Não Cadastrado");
        }

        return objPermissaoUsuario;
    }

    /**
     * Metodo que ira verificar a existência do PermissaoUsuario
     *
     * @param int idPermissaoUsuario
     * @return void
     */
    public boolean existe(int idPermissaoUsuario) throws ErroAcessoRepositorioException {
        PermissaoUsuario objPermissaoUsuario = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            // Salvando o produto no banco
            objPermissaoUsuario = (PermissaoUsuario) s.get(PermissaoUsuario.class, idPermissaoUsuario);
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
        }
        return (objPermissaoUsuario != null);
    }
        
    /**
     * Metodo que ira verificar a existência do PermissaoUsuario para o login e a permissão informada
     *
     * @param int idPermissaoUsuario
     * @return void
     */
    public boolean existePorIdLoginPorIdPermissao(int idLogin, int idPermissao) throws ErroAcessoRepositorioException {
        int qtdResultado = 0 ;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            Query q = s.createQuery("from PermissaoUsuario WHERE id_permissao_usuario IS NOT NULL AND id_login = :id_login AND id_permissao = :id_permissao ");
            q.setParameter("id_login", idLogin);
            q.setParameter("id_permissao", idPermissao);

            qtdResultado = q.list().size();
            
            // Comtando tudo caso der certo
            t.commit();
        } catch (Exception e) {
            t.rollback();
        }
        return (qtdResultado > 0);
    }

    /**
     * Metodo que ira listar os PermissaoUsuarios
     *
     * @return Collection
     */
    public List<PermissaoUsuario> listar(String strComplemento) throws ErroAcessoRepositorioException {
        List<PermissaoUsuario> listPermissaoUsuario = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            Query q = s.createQuery("from PermissaoUsuario WHERE id_permissao_usuario IS NOT NULL " + strComplemento);

            listPermissaoUsuario = q.list();
            t.commit();
        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }

        return listPermissaoUsuario;
    }

    /**
     * Metodo que ira listar os PermissaoUsuarios
     *
     * @return Collection
     */
    public List<PermissaoUsuario> listarPorLogin(int idLogin) throws Exception, ErroAcessoRepositorioException {
        
        List<PermissaoUsuario> listarPermissaoUsuario = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();
            
            // Criando a query
            Query q = s.createQuery("from PermissaoUsuario WHERE id_permissao_usuario IS NOT NULL AND id_login = :id_login ");

            // Setando os parametros da query
            q.setParameter("id_login", idLogin);
            
            // Listando as permissões
            listarPermissaoUsuario = q.list();

            t.commit();

        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }

        return listarPermissaoUsuario;
    }
    
    
    /**
     * Método que ira remover o PermissaoUsuario do banco
     *
     * @param idPermissaoUsuario
     */
    public void remover(int idPermissaoUsuario) throws PermissaoUsuarioNaoCadastradoException, ErroAcessoRepositorioException {
        PermissaoUsuario objPermissaoUsuario = null;
        if (this.existe(idPermissaoUsuario)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = (Transaction) s.beginTransaction();


                // Recupero o meu produto
                objPermissaoUsuario = (PermissaoUsuario) s.get(PermissaoUsuario.class, idPermissaoUsuario);

                // Seto seu id como excluido
                objPermissaoUsuario.setPermissao(null);

                t.commit();

                // Atualizo ele pra excluido
                this.cadastrarAtualizar(objPermissaoUsuario);

            } catch (Exception e) {
                t.rollback();
            }
            // this.objSession.close();

        } else {
            throw new PermissaoUsuarioNaoCadastradoException();
        }
    }
}